import Vue from 'vue'
import Vuex from "vuex";

// 1.安装插件
Vue.use(Vuex)

const store = new Vuex.Store({

  state: {
    userInfo: null,
	// Socket连接状态
	IsOpen:false,
	IsOpenDetail:false,
	// SocketTask
	SocketTask:false,
	SocketTaskDetail:false,
	// 是否上线（会员id绑定客户端id，验证用户身份，通过则绑定）
	IsOnline:false, 
	uid:null,
	// 未读数
	Noread:0,
  },
  mutations: {
    initUserInfo(state, payload) {
      state.userInfo = payload
	  uni.setStorageSync('userInfo',JSON.stringify(payload))
    },
    delUserInfo(state) {
      state.userInfo = null
	  uni.removeStorageSync('userInfo')
    }
  },
  actions: {
		login({state,dispatch}){
			let user = uni.getStorageSync('userInfo')
			if(user){
				state.userInfo = JSON.parse(user)
				// 打开socket
				dispatch('openSocket')
			}
		  },
		// 关闭socket
		closeSocket({state}){
			if (state.IsOpen){
				state.SocketTask.close();
			}
		},
		SendSocket({state},data){
			state.SocketTask.send({
				data
			})
		},
		// 打开socket
		openSocket({ state,dispatch }){
			// 防止重复连接
			if(state.IsOpen) return
			// 连接
			dispatch('totalNoread')
			//1.连接成功后创建用户组，将用户放入
			state.SocketTask = uni.connectSocket({
				url: "ws://192.168.0.102:8000/chat-channel",
				header:{
					"AUTHORIZATION":state.userInfo.token
				},
				complete: ()=> {}
			});
			if (!state.SocketTask) return;
			// 监听开启
			state.SocketTask.onOpen(()=>{
				// 将连接状态设为已连接
				console.log('将连接状态设为已连接');
				state.IsOpen = true
			})
			// 监听关闭
			state.SocketTask.onClose(()=>{
				console.log('连接已关闭');
				state.IsOpen = false;
				state.SocketTask = false;
				state.IsOnline = false
				// 清空会话列表
				// 更新未读数提示
			})
			// 监听错误
			state.SocketTask.onError(()=>{
				console.log('连接错误');
				state.IsOpen = false;
				state.SocketTask = false;
				state.IsOnline = false
			})
			// 监听接收信息
			state.SocketTask.onMessage((e)=>{
				let res = JSON.parse(e.data)
				// 用户如果在聊天中则发送信息
				if(state.IsOpenDetail){
					uni.$emit('UserChat',res.message);
				}else{
					uni.$emit('MsgList',res.message);
					state.Noread++
					// 记录聊天未读信息+当前发送信息
					uni.setTabBarBadge({
						index:2,
						text: state.Noread > 99 ? '99+' : state.Noread.toString()
					});
					// 如果用户不在聊天中或离线，则将消息设置为未读
					
				}
				
			})
	},
		// 第一次从数据库读取到的消息
		totalNoread({state}){
			if(!state.userInfo){
				uni.removeTabBarBadge({
					index:2
				})
				return
			}
			uni.request({
				url:"http://192.168.0.102:8000/api/news/",
				header:{
					AUTHORIZATION:state.userInfo.token
				},
				success(res) {
					let total = 0
					res.data.forEach(item=>{
						if(item.user==state.userInfo.id){
							return
						}
						total +=item.unread
					})
					state.Noread = total
					// uni.$emit("totalNoread",res.data)
					// 未读数为0,移除
					if(state.Noread === 0){
						console.log('移除未读数');
						return uni.removeTabBarBadge({
							index:2
						})
					}
					uni.setTabBarBadge({
						index:2,
						text: state.Noread > 99 ? '...' : state.Noread.toString()
					});
				}
			})
			
		},
		closeSocketDetail({state}){
				state.SocketTaskDetail.close();
			},
		SendSocketDetail({state},data){
			state.SocketTaskDetail.send({
				data:JSON.stringify(data)
			})
		},
		// 打开socket
		openSocketDetail({state},uid){
			// 防止重复连接
			if(state.IsOpenDetail) return
			// 连接
			if(state.SocketTaskDetail){
				state.SocketTaskDetail.close()
			}
			//1.连接成功后创建用户组，将用户放入
			state.SocketTaskDetail = uni.connectSocket({
				url: `ws://192.168.0.102:8000/chat-channel/${uid}/`,
				header:{
					"AUTHORIZATION":state.userInfo.token
				},
				complete: ()=> {}
			});
			if (!state.SocketTaskDetail) return;
			// 监听开启
			state.SocketTaskDetail.onOpen(()=>{
				// 将连接状态设为已连接
				console.log('子连接状态设为已连接');
				state.IsOpenDetail = true
			})
			// 监听关闭
			state.SocketTaskDetail.onClose(()=>{
				console.log('子连接已关闭');
				state.IsOpenDetail = false;
				state.SocketTaskDetail = false;
				state.IsOnline = false
				// 清空会话列表
				// 更新未读数提示
			})
			// 监听错误
			state.SocketTaskDetail.onError(()=>{
				console.log('连接错误');
				state.IsOpenDetail = false;
				state.SocketTaskDetail = false;
				state.IsOnline = false
			})
			// 监听接收信息
			state.SocketTaskDetail.onMessage((e)=>{
				let res = JSON.parse(e.data)
				// uni.$emit('UserChat',res.message);
				// 字符串转json
			})
		},
  },
  getters: {
		
  },
  modules: {}
})

// 3.导出store独享
export default store